package com.ruoyi.wxapi;

import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;

import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.http.HttpUtils;
import com.ruoyi.common.utils.uuid.UUID;
import com.ruoyi.wx.domain.AWxappConfig;
import com.ruoyi.wx.domain.AWxuser;
import com.ruoyi.wx.service.IAWxappConfigService;
import com.ruoyi.wx.service.IAWxuserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/**
 * author：pan
 * 微信小程序登陆
 *
 */

@RestController
@RequestMapping("/wxapi/")
public class WxLoginController {

    @Autowired
    private IAWxappConfigService wxappConfigService;

    @Autowired
    private IAWxuserService wxuserService;

    /**
     * 登录时获取的 code（微信官方提供的临时凭证）
     * @param object
     * @return
     */
    @PostMapping("/wxlogin")
    public AjaxResult wxLogin(@RequestBody JSONObject object){
        //微信官方提供的微信小程序登录授权时使用的URL地址
        String url  = "https://api.weixin.qq.com/sns/jscode2session";
        System.out.println(object);
        /**
         * 拼接需要的参数
         * appid = AppID 你自己的微信小程序APPID
         * js_code = AppSecret 你自己的微信APP密钥
         * grant_type=authorization_code = code 微信官方提供的临时凭证
         */

        AWxappConfig wxconfig =  wxappConfigService.selectWxappConfig();
        String params = StrUtil.format(
                "appid={}&secret={}&js_code={}&grant_type=authorization_code",
                wxconfig.getAppid(), wxconfig.getAppSecret(), object.get("code"));

        //开始发起网络请求,若依管理系统自带网络请求工具，直接使用即可
        String res = HttpUtils.sendGet(url,params);
        JSONObject jsonObject = JSON.parseObject(res);

        String session_key = (String) jsonObject.get("session_key");
        String openid = (String) jsonObject.get("openid");

        if (StrUtil.isEmpty(openid)) {
            return AjaxResult.error("未获取到openid");
        }

        String token = UUID.randomUUID().toString();
        Map<String, Object> data = new HashMap<>();
        data.put("token", token);
        data.put("session_key", session_key);
        data.put("openid", openid);
        data.put("state",true);

        /**先通过openid来查询是否存在*/
        AWxuser wxuser = wxuserService.selectWxuserOpenID(openid);

        if (wxuser == null){
            /**如果不存在就插入到我们的数据库里*/
            // 创建用户对象 接收用户数据
            AWxuser newUser = new AWxuser();
            newUser.setNickname(String.valueOf(object.get("nickName")));
            newUser.setAvatar(String.valueOf(object.get("avatarUrl")));
            newUser.setGender("未知");
            newUser.setSituation("正常");
            newUser.setIdentity("用户");

            newUser.setOpenid(openid);
            newUser.setCreateTime(DateUtils.getNowDate());  // 创建时间
            newUser.setUpdateTime(DateUtils.getNowDate());  // 更新时间

            // 新用户就用默认的
            data.put("nickName",object.get("nickName"));
            data.put("avatarUrl",object.get("avatarUrl"));

            wxuserService.insertAWxuser(newUser);

        }else {

            //用户 是否被禁用
            if (wxuser.getSituation().equals("禁用")){
                return AjaxResult.error("该用户已被禁用，请联系管理员！");
            }

            // 老用户就用自己的
            data.put("nickName", wxuser.getNickname());
            data.put("avatarUrl", wxuser.getAvatar());
            data.put("identity",wxuser.getIdentity());

            /**如果存在就更新数据库里原有的数据*/
            // wxuser.setNickname(String.valueOf(object.get("nickName")));
            // wxuser.setAvatar(String.valueOf(object.get("avatarUrl")));
            wxuser.setUpdateTime(DateUtils.getNowDate());  // 更新时间

            wxuserService.updateAWxuser(wxuser);


        }


        /**返回结果集到前端*/
        return AjaxResult.success("登陆成功",data);
    }


    /**
     * 更新用户资料（头像，昵称）
     * @param aWxuser
     * @return
     */
    @PostMapping("/wxUserUpdate")
    public AjaxResult wxUserUpdate(@RequestBody AWxuser aWxuser){

        // 获取用户数据
        AWxuser wxuser = wxuserService.selectWxuserOpenID(aWxuser.getOpenid());

        if (wxuser == null){
            return AjaxResult.error("该用户不存在");
        }

        if (wxuser.getSituation().equals("禁用")){
            return AjaxResult.error("该用户已被禁用，请联系管理员！");
        }

        /**如果存在就更新数据库里原有的数据*/
        wxuser.setNickname(String.valueOf(aWxuser.getNickname()));
        wxuser.setAvatar(String.valueOf(aWxuser.getAvatar()));
        wxuser.setUpdateTime(DateUtils.getNowDate());  // 更新登陆时间

        // 保存更新数据
        wxuserService.updateAWxuser(wxuser);

        return AjaxResult.success("更新完成，请重新登陆");
    }
}
